/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.dao;

import br.com.deployment.daogenerico.DaoGenerico;
import br.com.deployment.entidade.registroimovel.Folha;
import br.com.deployment.entidade.registroimovel.Livro;
import br.com.deployment.interfaces.LivroDaoIn;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author roniere
 */
@Stateless
@LocalBean
public class LivroDao extends DaoGenerico<Livro> implements LivroDaoIn{

    public LivroDao() {
        super(Livro.class);
    }
    public Livro find(Long id){
        String sql = " Select l from Livro l where "
                + " l.id = :id ";
        Query query = getEm().createQuery(sql);
        query.setParameter("id", id);
        return  (Livro) query.getResultList().iterator().next();
    }
    
    public List<Livro> findLivro(Livro livro, Integer qtd){
        String sql = " Select l from Livro l where "
                + " l.titulo like :titulo ";
        Query query = getEm().createQuery(sql).setMaxResults(qtd);
        query.setParameter("titulo", "%"+livro.getTitulo()+"%");
        return query.getResultList();
    }
    
    
    
    //ELY
    
    
     public Long qtdFolhaLivro(Livro livro) {
        Long qtd = 0L;
        String sql = "select count(f) from Livro v JOIN v.folhas f where "
                + " v.id = :id ";
        Query query = getEm().createQuery(sql);
        query.setParameter("id", livro.getId());
        qtd = (Long) query.getSingleResult();
        return qtd;
    }
     
    public List<Livro> findLivros(Livro livro){
        String sql = "select v from Livro v JOIN v.folhas f where "
                + " v.id = :id ";
        Query query = getEm().createQuery(sql);
        query.setParameter("id", livro.getId());
        return query.getResultList();
    } 
    
     public List<Livro> Livros(Livro livro, Folha folha) {
        List<Livro> lista = new ArrayList<Livro>();
        String sql = " Select l from Livro l ";

        if (folha.getNumero() != null) {

            sql += " JOIN l.folhas f where f.numero =:num and ";
        } else {
            sql += " where ";

        }
        if (livro != null) {
            sql += " l.id = :id and";
            //sql += " lower(l.titulo) like lower(:t) and";
        }

        sql += " 1=1 ";

        Query query = getEm().createQuery(sql);

        if (folha.getNumero() != null) {

            query.setParameter("num", folha.getNumero());

        }

        if (livro != null) {
            query.setParameter("id", livro.getId());
            //query.setParameter("t", "%" + livro.getTitulo() + "%");
        }


        lista = query.getResultList();

        return lista;
    }
     
     //
     
     public List<Livro> findLivroTitulo(Livro livro) {
        List<Livro> lista = new ArrayList<Livro>();
        String sql = "select l from Livro l ";

        if (livro != null) {
            if (livro.getTitulo() != null) {
                sql += " where l.titulo like :titulo";
            }
        }
        Query query = getEm().createQuery(sql);
        if (livro != null) {
            if (livro.getTitulo() != null) {
                query.setParameter("titulo", "%" + livro.getTitulo() + "%");
            }
        }

        lista = query.getResultList();
        return lista;
    }
     
      public Integer MenorNumero(Livro livro) {
        Integer qtd = 0;
        String sql = "select min(f.numero) from Livro v JOIN v.folhas f where "
                + " v.id = :id ";
        Query query = getEm().createQuery(sql);
        query.setParameter("id", livro.getId());
        qtd = (Integer) query.getSingleResult();
        return qtd;
    }

    public List<Folha> findFolhas(Livro livro, Folha folha) {
        List<Folha> lista = new ArrayList<Folha>();
        String sql = "select f from Livro l JOIN l.folhas f where ";
//                + " l.id = :id_livro and f.numero = :num";
            if (folha.getNumero() == null) {
                sql += "l.id = :id ";
                System.out.println("Achou");
            }
        
        if (folha.getNumero() != null) {
            sql += " l.id = :id and f.numero = :num";
            System.out.println("Achou não é nullor");
        }
       
        Query query = getEm().createQuery(sql);
        
        if (folha.getNumero() == null) {
            query.setParameter("id", livro.getId());
        }
        if (folha.getNumero() != null) {
            query.setParameter("num", folha.getNumero());
            query.setParameter("id", livro.getId());
        }
        lista = query.getResultList();

        return lista;
    }
    
    public List<Folha> findFolhasLivro(Livro livro) {
        List<Folha> lista = new ArrayList<Folha>();
        String sql = "select f from Livro l JOIN l.folhas f where l.id =:id";
       
        Query query = getEm().createQuery(sql);
        query.setParameter("id",livro.getId());
        lista = query.getResultList();

        return lista;
    }
//    public List<Folha> findFolhas(Livro livro, Folha folha) {
//        List<Folha> lista = new ArrayList<Folha>();
//        String sql = "select f from Livro l JOIN l.folhas f where  ";
//
//        
//        Query query = getEm().createQuery(sql);
//        query.setParameter("id", livro.getId());
//        //query.setParameter("num", folha.getNumero());
//        lista = query.getResultList();
//
//        return lista;
//    }

    public List<Folha> findFolhasIntervalo(Livro livro, int num1, int num2) {
        List<Folha> lista = new ArrayList<Folha>();
        String sql = " Select f from Livro l JOIN l.folhas f where l.id = :id and f.numero "
                + " between :num1 AND :num2 ";

        Query query = getEm().createQuery(sql);

        query.setParameter("id", livro.getId());
        query.setParameter("num1", num1);
        query.setParameter("num2", num2);

        lista = query.getResultList();

        return lista;

    }

    public List<Livro> LivrosIntervalo(Livro livro, Folha folha, int num1, int num2) {
        List<Livro> lista = new ArrayList<Livro>();
        String sql = " Select DISTINCT(l) from Livro l ";

        if (folha.getNumero() != null) {

            sql += " JOIN l.folhas f where f.numero between :num1 and :num2 and ";
        } else {
            sql += " where ";

        }
        if (livro != null) {
            sql += " l.id = :id and";
            //sql += " lower(l.titulo) like lower(:t) and";
        }

        sql += " 1=1 ";

        Query query = getEm().createQuery(sql);

        if (folha.getNumero() != null) {

            query.setParameter("num1", num1);
            query.setParameter("num2", num2);
        }

        if (livro != null) {
            query.setParameter("id", livro.getId());
            //query.setParameter("t", "%" + livro.getTitulo() + "%");
        }


        lista = query.getResultList();

        return lista;
    }
}